package Thread;

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
       final Object obj = new Object();


       Thread t1 = new Thread(()->{
           synchronized (obj){

               System.out.println("wait开始");//1
               try {
                   obj.wait();//释放锁
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("wait结束");//4


           }
           synchronized (obj){
               System.out.println("t1结束");//5
               try {
                   obj.wait();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("666");//7
           }
       });
       Thread t2 = new Thread(()->{
           synchronized (obj){
               //拿到所
               System.out.println("notify开始");//2
               obj.notify();//通知t1线程可以唤醒了,自此之前t1线程是处于阻塞状态的
               System.out.println("notify结束");//3
               //当执行完锁内的全部逻辑后会释放锁,此时t1就可以抢到这个锁,因为存在锁竞争问题,所以不一定是只有t1才能获得锁对象
           }
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           synchronized (obj) {
               obj.notify();
             System.out.println("t2结束");//6
         }
         });
       t1.start();
       Thread.sleep(1000);
        System.out.println(t1.getState());
        t2.start();
    }
    //wait和sleep的区别
    //sleep的作用是令该线程产生阻塞效果,sleep分为有参数和无参数版本,在不同的需求下可以运用不同的方法
    //并且它的使用条件与是否有锁无关
    //wait,wait也提供了带参数和不带参数版本,wait的使用环境需要是在锁内使用,当该锁内进行了wait之后,此锁就会
    //进入阻塞状态,如果没有唤醒就会一直阻塞下去,当其他锁内进行了notify之后,该锁就会被唤醒,此时该锁就可以等到
    //锁对象释放的时候进行争抢,
    //wait可以提前唤醒 sleep也可以提前唤醒
    //notify 通过修改标志位
    //他俩最大的区别在于初心不同
    //wait解决的是线程之间的顺序控制,而sleep就是单纯的让线程睡眠一定时间
}
